/*
 * PPD.c
 *
 *  Created on: 15/09/2011
 *      Author: agustin
 */



#include "leerEscribir.h"
#include "PPD.h"

extern uint16_t posActualCabezal;
extern char *PATH;

int8_t abrirArchivo() {

	int8_t archivo;
	uint16_t sizeofpage;
	archivo = open(PATH, O_RDWR);
	if (archivo < 0) {
		perror("No se puede abrir el archivo");
	};
	sizeofpage = getpagesize();
	posix_madvise(NULL, sizeofpage, MADV_SEQUENTIAL);
	return archivo;
}

t_sector leerSector(t_sector sector, uint8_t archivo, uint16_t retardo) {
	char *data,buffer[512];;
	t_sector *leido;
	uint16_t sizeofpage, offset;
	uint32_t NroPagina;
	leido = (t_sector*)malloc(sizeof(t_sector));
	sizeofpage = getpagesize();
	NroPagina = (sector.numero / 8) * sizeofpage; // Cociente de la division //
	offset = (sector.numero % 8) * 512; // Resto de la division //
	data = (char *) mmap(NULL, sizeofpage, PROT_READ, MAP_SHARED, archivo,
			NroPagina);
	data += offset;
	memcpy(buffer, data, 512);
	munmap(data, sizeofpage);
	posActualCabezal = sector.numero + 1;
	memcpy(leido->datos, buffer,512);
	leido->numero = sector.numero;
	leido->type = sector.type;
	sleep(retardo);
	return *leido;
}

void escribirSector(t_sector sector, uint8_t archivo, uint16_t retardo) {
	char *data = NULL;
	uint16_t sizeofpage, offset;
	uint32_t NroPagina;
	sizeofpage = getpagesize();
	NroPagina = (sector.numero / 8) * sizeofpage; // Cociente de la division //
	offset = (sector.numero % 8) * 512; // Resto de la division //
	data = (char *) mmap(NULL, sizeofpage, PROT_READ | PROT_WRITE
	, MAP_SHARED, archivo, NroPagina);
	memcpy(data + offset, sector.datos, 512);
	sleep(retardo);
	msync(data, sizeofpage, MS_SYNC);
	munmap(data, sizeofpage);
	posActualCabezal = sector.numero + 1;
}
